From 50275e9c8ae9c8a0c05e0130a218c1369da73b94 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Thu, 19 May 2005 13:24:18 +0000 Subject: [PATCH] bitkeeper revision 1.1463 (428c9382-vrHzvryhVgUsKq4C6xVHA) Add l?e_create_page() macros. map_pages_to_xen() now takes a pfn range rather than a byte range. Fix x86/64 RAM mapping to discard partial frames. Signed-off-by: Keir Fraser --- xen/arch/x86/domain.c | 8 ++---- xen/arch/x86/mm.c | 59 +++++++++++++++++++++++--------------- xen/arch/x86/setup.c | 24 +++++++++------- xen/arch/x86/shadow.c | 2 +- xen/arch/x86/x86_32/mm.c | 8 ------ xen/arch/x86/x86_64/mm.c | 16 +++-------- xen/include/asm-x86/page.h | 13 ++++++--- 7 files changed, 66 insertions(+), 64 deletions(-) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index fa5343e3d2..7635b2c42d 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -263,9 +263,8 @@ void arch_do_createdomain(struct exec_domain *ed) PAGE_SHIFT] = INVALID_M2P_ENTRY; ed->arch.perdomain_ptes = d->arch.mm_perdomain_pt; ed->arch.perdomain_ptes[FIRST_RESERVED_GDT_PAGE] = - l1e_create_pfn(page_to_pfn(virt_to_page(gdt_table)), - PAGE_HYPERVISOR); - + l1e_create_page(virt_to_page(gdt_table), PAGE_HYPERVISOR); + ed->arch.guest_vtable = __linear_l2_table; ed->arch.shadow_vtable = __shadow_linear_l2_table; @@ -302,8 +301,7 @@ void arch_do_boot_vcpu(struct exec_domain *ed) ed->arch.perdomain_ptes = d->arch.mm_perdomain_pt + (ed->vcpu_id << PDPT_VCPU_SHIFT); ed->arch.perdomain_ptes[FIRST_RESERVED_GDT_PAGE] = - l1e_create_pfn(page_to_pfn(virt_to_page(gdt_table)), - PAGE_HYPERVISOR); + l1e_create_page(virt_to_page(gdt_table), PAGE_HYPERVISOR); } #ifdef CONFIG_VMX diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 720f73ec04..cd96fec083 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -161,7 +161,10 @@ void __init init_frametable(void) if ( p == 0 ) panic("Not enough memory for frame table\n"); map_pages_to_xen( - FRAMETABLE_VIRT_START + i, p, 4UL << 20, PAGE_HYPERVISOR); + FRAMETABLE_VIRT_START + i, + p >> PAGE_SHIFT, + 4UL << (20-PAGE_SHIFT), + PAGE_HYPERVISOR); } memset(frame_table, 0, frame_table_size); @@ -2833,31 +2836,30 @@ void ptwr_destroy(struct domain *d) free_xenheap_page((unsigned long)d->arch.ptwr[PTWR_PT_INACTIVE].page); } -/* Map physical byte range (@p, @p+@s) at virt address @v in pagetable @pt. */ int map_pages_to_xen( - unsigned long v, - unsigned long p, - unsigned long s, + unsigned long virt, + unsigned long pfn, + unsigned long nr_pfns, unsigned long flags) { l2_pgentry_t *pl2e, ol2e; - l1_pgentry_t *pl1e; + l1_pgentry_t *pl1e, ol1e; unsigned int i; unsigned int map_small_pages = !!(flags & MAP_SMALL_PAGES); flags &= ~MAP_SMALL_PAGES; - while ( s != 0 ) + while ( nr_pfns != 0 ) { - pl2e = virt_to_xen_l2e(v); + pl2e = virt_to_xen_l2e(virt); - if ( (((v|p) & ((1 << L2_PAGETABLE_SHIFT) - 1)) == 0) && - (s >= (1 << L2_PAGETABLE_SHIFT)) && + if ( ((((virt>>PAGE_SHIFT) | pfn) & ((1<= (1<= __end_of_fixed_addresses) ) + BUG(); + map_pages_to_xen(fix_to_virt(idx), p >> PAGE_SHIFT, 1, flags); +} + #ifdef MEMORY_GUARD void memguard_init(void) { map_pages_to_xen( - PAGE_OFFSET, 0, xenheap_phys_end, __PAGE_HYPERVISOR|MAP_SMALL_PAGES); + PAGE_OFFSET, 0, xenheap_phys_end >> PAGE_SHIFT, + __PAGE_HYPERVISOR|MAP_SMALL_PAGES); } static void __memguard_change_range(void *p, unsigned long l, int guard) @@ -2927,7 +2939,8 @@ static void __memguard_change_range(void *p, unsigned long l, int guard) if ( guard ) flags &= ~_PAGE_PRESENT; - map_pages_to_xen((unsigned long)(_p), __pa(_p), _l, flags); + map_pages_to_xen( + _p, virt_to_phys(p) >> PAGE_SHIFT, _l >> PAGE_SHIFT, flags); } void memguard_guard_range(void *p, unsigned long l) diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index 0998b207f5..644dc7d3e9 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -399,7 +399,7 @@ static void __init start_of_day(void) /* Map default GDT into their final position in the idle page table. */ map_pages_to_xen( GDT_VIRT_START(current) + FIRST_RESERVED_GDT_BYTE, - virt_to_phys(gdt_table), PAGE_SIZE, PAGE_HYPERVISOR); + virt_to_phys(gdt_table) >> PAGE_SHIFT, 1, PAGE_HYPERVISOR); /* Process CPU type information. */ identify_cpu(&boot_cpu_data); @@ -580,17 +580,19 @@ void __init __start_xen(multiboot_info_t *mbi) * due to cache-attribute mismatches (e.g., AMD/AGP Linux bug). */ { - unsigned long start = (unsigned long)e820.map[i].addr; - unsigned long size = (unsigned long)e820.map[i].size; - size = (size + (start & ~PAGE_MASK) + PAGE_SIZE - 1) & PAGE_MASK; - if ( (start &= PAGE_MASK) < (64UL << 20) ) - { - if ( (signed long)(size -= (64UL << 20) - start) <= 0 ) - continue; - start = 64UL << 20; - } + /* Calculate page-frame range, discarding partial frames. */ + unsigned long start, end; + start = (e820.map[i].addr + PAGE_SIZE - 1) >> PAGE_SHIFT; + end = (e820.map[i].addr + e820.map[i].size) >> PAGE_SHIFT; + /* Clip the range to above 64MB. */ + if ( end < (64UL << (20-PAGE_SHIFT)) ) + continue; + if ( start < (64UL << (20-PAGE_SHIFT)) ) + start = 64UL << (20-PAGE_SHIFT); + /* Request the mapping. */ map_pages_to_xen( - PAGE_OFFSET + start, start, size, PAGE_HYPERVISOR); + PAGE_OFFSET + (start << PAGE_SHIFT), + start, end-start, PAGE_HYPERVISOR); } #endif } diff --git a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c index 05a34bf820..86ae84f116 100644 --- a/xen/arch/x86/shadow.c +++ b/xen/arch/x86/shadow.c @@ -789,7 +789,7 @@ set_p2m_entry(struct domain *d, unsigned long pfn, unsigned long mfn, memset(l1, 0, PAGE_SIZE); unmap_domain_mem_with_cache(l1, l1cache); - l2e = l2e_create_pfn(page_to_pfn(l1page), __PAGE_HYPERVISOR); + l2e = l2e_create_page(l1page, __PAGE_HYPERVISOR); l2[l2_table_offset(va)] = l2e; } unmap_domain_mem_with_cache(l2, l2cache); diff --git a/xen/arch/x86/x86_32/mm.c b/xen/arch/x86/x86_32/mm.c index 744ba23193..da17c929e0 100644 --- a/xen/arch/x86/x86_32/mm.c +++ b/xen/arch/x86/x86_32/mm.c @@ -54,14 +54,6 @@ l2_pgentry_t *virt_to_xen_l2e(unsigned long v) return &idle_pg_table[l2_table_offset(v)]; } -void __set_fixmap( - enum fixed_addresses idx, unsigned long p, unsigned long flags) -{ - if ( unlikely(idx >= __end_of_fixed_addresses) ) - BUG(); - map_pages_to_xen(fix_to_virt(idx), p, PAGE_SIZE, flags); -} - void __init paging_init(void) { void *ioremap_pt; diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c index 532ad606ce..9e6f592e6d 100644 --- a/xen/arch/x86/x86_64/mm.c +++ b/xen/arch/x86/x86_64/mm.c @@ -72,17 +72,9 @@ l2_pgentry_t *virt_to_xen_l2e(unsigned long v) return pl2e; } -void __set_fixmap( - enum fixed_addresses idx, unsigned long p, unsigned long flags) -{ - if ( unlikely(idx >= __end_of_fixed_addresses) ) - BUG(); - map_pages_to_xen(fix_to_virt(idx), p, PAGE_SIZE, flags); -} - void __init paging_init(void) { - unsigned long i, p; + unsigned long i; l3_pgentry_t *l3rw, *l3ro; struct pfn_info *pg; @@ -96,10 +88,10 @@ void __init paging_init(void) NULL, L2_PAGETABLE_SHIFT - L1_PAGETABLE_SHIFT); if ( pg == NULL ) panic("Not enough memory for m2p table\n"); - p = page_to_phys(pg); map_pages_to_xen( - RDWR_MPT_VIRT_START + i*8, p, - 1UL << L2_PAGETABLE_SHIFT, PAGE_HYPERVISOR | _PAGE_USER); + RDWR_MPT_VIRT_START + i*8, page_to_pfn(pg), + 1UL << (L2_PAGETABLE_SHIFT - L1_PAGETABLE_SHIFT), + PAGE_HYPERVISOR | _PAGE_USER); memset((void *)(RDWR_MPT_VIRT_START + i*8), 0x55, 1UL << L2_PAGETABLE_SHIFT); } diff --git a/xen/include/asm-x86/page.h b/xen/include/asm-x86/page.h index 93018113a1..529c4ed0b6 100644 --- a/xen/include/asm-x86/page.h +++ b/xen/include/asm-x86/page.h @@ -43,6 +43,11 @@ typedef struct { unsigned long pt_lo; } pagetable_t; #define l3e_get_page(_x) (pfn_to_page(l3e_get_pfn(_x))) #define l4e_get_page(_x) (pfn_to_page(l4e_get_pfn(_x))) +#define l1e_create_page(_x,_y) (l1e_create_pfn(page_to_pfn(_x),(_y))) +#define l2e_create_page(_x,_y) (l2e_create_pfn(page_to_pfn(_x),(_y))) +#define l3e_create_page(_x,_y) (l3e_create_pfn(page_to_pfn(_x),(_y))) +#define l4e_create_page(_x,_y) (l4e_create_pfn(page_to_pfn(_x),(_y))) + /* High table entries are reserved by the hypervisor. */ #define DOMAIN_ENTRIES_PER_L2_PAGETABLE \ (HYPERVISOR_VIRT_START >> L2_PAGETABLE_SHIFT) @@ -141,13 +146,13 @@ struct pfn_info *alloc_xen_pagetable(void); void free_xen_pagetable(struct pfn_info *pg); l2_pgentry_t *virt_to_xen_l2e(unsigned long v); -/* Map physical byte range (@p, @p+@s) at address @v in Xen address space. */ +/* Map physical page range in Xen virtual address space. */ #define MAP_SMALL_PAGES (1UL<<16) /* don't use superpages for the mapping */ int map_pages_to_xen( - unsigned long v, - unsigned long p, - unsigned long s, + unsigned long virt, + unsigned long pfn, + unsigned long nr_pfns, unsigned long flags); #endif /* !__ASSEMBLY__ */ -- 2.30.2